defmodule EliPhxPlay.ChatSchema.UserRelationships do
  use Ecto.Schema
  import Ecto.Changeset

  # 定义主键
  @primary_key {:relationship_id, :binary_id, autogenerate: true}
  # 定义外键类型
  @foreign_key_type :binary_id

  # 定义schema
  schema "user_relationships" do
    # 定义关系状态字段，默认值为"pending"
    field :relationship_status, :string, default: "pending"
    # 定义备注名称字段
    field :remark_name, :string

    # 定义user_a字段，与EliPhxPlay.ChatSchema.Users表关联，外键为user_a_id，类型为binary_id
    belongs_to :user_a, EliPhxPlay.ChatSchema.Users,
      foreign_key: :user_a_id,
      references: :user_id,
      type: :binary_id

    # 定义user_b字段，与EliPhxPlay.ChatSchema.Users表关联，外键为user_b_id，类型为binary_id
    belongs_to :user_b, EliPhxPlay.ChatSchema.Users,
      foreign_key: :user_b_id,
      references: :user_id,
      type: :binary_id

    # 定义时间戳
    timestamps()
  end

  # 定义changeset函数，用于验证和修改数据
  def changeset(user_relationships, attrs) do
    user_relationships
    # 使用cast函数将attrs中的数据映射到user_relationships中
    |> cast(attrs, [:user_a_id, :user_b_id, :relationship_status, :remark_name])
    # 使用validate_required函数验证user_a_id和user_b_id字段是否为空
    |> validate_required([:user_a_id, :user_b_id])
    # 使用validate_inclusion函数验证relationship_status字段是否为"pending"、"accepted"、"blocked"、"rejected"中的一个
    |> validate_inclusion(:relationship_status,
        ["pending", "accepted", "blocked", "rejected"])
    # 调用validate_self_adding函数验证user_a_id和user_b_id字段是否相同
    |> validate_self_adding()
    # 使用unique_constraint函数验证user_a_id和user_b_id字段是否唯一
    |> unique_constraint([:user_a_id, :user_b_id])
  end

  # 定义validate_self_adding函数，用于验证user_a_id和user_b_id字段是否相同
  def validate_self_adding(changeset) do
    # 获取user_a_id字段的值
    user_a_id = get_field(changeset, :user_a_id)
    # 获取user_b_id字段的值
    user_b_id = get_field(changeset, :user_b_id)

    # 如果user_a_id和user_b_id相同，则添加错误信息
    if user_a_id == user_b_id do
      add_error(changeset, :user_b_id, "不能添加自己为好友")
    else
      # 否则返回changeset
      changeset
    end
  end
end
